<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>


    <script type="module">
        console.log(typeof button); // object：脚本可以“看见”下面的 button // 因为模块是被延迟的（deferred，所以模块脚本会在整个页面加载完成后才运行
    </script>

    <script>
        console.log(typeof button); // Error: button is undefined，脚本看不到下面的元素
        // 常规脚本会立即运行，常规脚本的运行是在在处理页面的其余部分之前进行的
    </script>

    <button id="button">Button</button>

    <script>
        function getSequence(arr) {
            const p = arr.slice() // 拷贝一个数组 p
            const result = [0]
            let i, j, u, v, c
            const len = arr.length
            for (i = 0; i < len; i++) {
                const arrI = arr[i]
                    // 排除等于 0 的情况
                if (arrI !== 0) {
                    j = result[result.length - 1]
                        // 与最后一项进行比较
                    if (arr[j] < arrI) {
                        p[i] = j // 最后一项与 p 对应的索引进行对应
                        result.push(i)
                        continue
                    }
                    // arrI 比 arr[j] 小，使用二分查找找到后替换它
                    // 定义二分查找区间
                    u = 0
                    v = result.length - 1
                        // 开启二分查找
                    while (u < v) {
                        // 取整得到当前位置
                        c = ((u + v) / 2) | 0
                        if (arr[result[c]] < arrI) {
                            u = c + 1
                        } else {
                            v = c
                        }
                    }
                    // 比较 => 替换
                    if (arrI < arr[result[u]]) {
                        if (u > 0) {
                            p[i] = result[u - 1] // 正确的结果
                        }
                        result[u] = i // 有可能替换会导致结果不正确，需要一个新数组 p 记录正确的结果
                    }
                }
            }
            u = result.length
            v = result[u - 1]
                // 倒叙回溯 用 p 覆盖 result 进而找到最终正确的索引
            console.log('result', result)
            console.log('p', p)
            while (u-- > 0) {
                result[u] = v
                v = p[v]
            }
            return result
        }

        var arr = [0, 1, 4, 3, 5, 7, 6, 2]

        var arr2 = getSequence(arr)
        console.log(arr2)
    </script>
</body>

</html>